catch theme and color changes
authorcinamod <cinamod>
Fri, 3 Oct 2003 15:54:20 +0000 (15:54 +0000)
committercinamod <cinamod>
Fri, 3 Oct 2003 15:54:20 +0000 (15:54 +0000)
modules/engines/ms-windows/ChangeLog.old
modules/engines/ms-windows/wimp_theme_main.c
modules/engines/ms-windows/xp_theme.c

index d619689e2d9d2f81b9979a79a0654a1e76a0bdd3..9b2fbc4380a4f77710fadd9c05bb5484e5d99ba1 100755 (executable)
@@ -1,3 +1,7 @@
+2003-10-03  Dom Lachowicz <cinamod@hotmail.com>\r
+\r
+       * src/wimp_style_main.c: Catch theme and color changes. Needs more testing and fine-tuning\r
+       \r
 2003-10-02  Dom Lachowicz <cinamod@hotmail.com>\r
 \r
        * src/wimp_style.c: Deallocate used HDCs\r
index 504727a07cd5c19832d9a50eb8575bcc9ad7d194..a54d01ad2ec893ba61010e457c77df1518bc56a9 100755 (executable)
  * Boston, MA 02111-1307, USA.\r
  */\r
 \r
+#include <windows.h>\r
 #include <gmodule.h>\r
 #include <gtk/gtk.h>\r
 \r
 #include "wimp_style.h"\r
 #include "wimp_rc_style.h"\r
 \r
+#ifndef WM_THEMECHANGED\r
+#define WM_THEMECHANGED 0x031A /* winxp only */\r
+#endif\r
+\r
+static GdkFilterReturn\r
+global_filter_func (void     *xevent,\r
+                   GdkEvent *event,\r
+                   gpointer  data)\r
+{\r
+  MSG *msg = (MSG *) xevent;\r
+  GList * toplevels, *iter;\r
+  GtkWidget * toplevel;\r
+\r
+  switch (msg->message)\r
+    {\r
+    case WM_THEMECHANGED:\r
+       case WM_SYSCOLORCHANGE:\r
+               toplevels = gtk_window_list_toplevels ();\r
+               if (toplevels) {\r
+                       xp_theme_exit();\r
+                       for (iter = g_list_first(toplevels);\r
+                                iter;\r
+                                iter = g_list_next (iter)) {\r
+                               toplevel = (GtkWidget*)iter->data;\r
+                               if (toplevel)\r
+                                       gtk_widget_reset_rc_styles (toplevel);\r
+                       }\r
+                       g_list_free (toplevels);\r
+               }\r
+               return GDK_FILTER_REMOVE;\r
+       default:\r
+               return GDK_FILTER_CONTINUE;\r
+       }\r
+}\r
+\r
 G_MODULE_EXPORT void\r
 theme_init (GTypeModule *module)\r
 {\r
   wimp_rc_style_register_type (module);\r
   wimp_style_register_type (module);\r
+\r
+  gdk_window_add_filter (NULL, global_filter_func, NULL);\r
 }\r
 \r
 G_MODULE_EXPORT void\r
 theme_exit (void)\r
 {\r
+       gdk_window_remove_filter (NULL, global_filter_func, NULL);\r
 }\r
 \r
 G_MODULE_EXPORT GtkRcStyle *\r
 theme_create_rc_style (void)\r
 {\r
-  return GTK_RC_STYLE (g_object_new (WIMP_TYPE_RC_STYLE, NULL));  \r
+  return GTK_RC_STYLE (g_object_new (WIMP_TYPE_RC_STYLE, NULL));\r
 }\r
 \r
 /* The following function will be called by GTK+ when the module\r
index 96f1b70dd6c9e8b1003ccd75f018b77b70037f18..44166d1d2e6fcd8d29c98c7be1b23d9b87ba68a8 100755 (executable)
@@ -135,7 +135,7 @@ xp_theme_exit()
   if(!uxtheme_dll)
     return;
 
-  for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)
+  for (i=0; i < XP_THEME_CLASS__SIZEOF; i++)
     {
       if (open_themes[i])
         {